﻿using System.Drawing;
using MDAControlsFramework.Helpers;

namespace MDAControlsFramework {
	/// <summary>
	/// vykreslí všechny prvky ve stejné velikosti, bez ohledu na jejich nastavení
	/// směry se volí podle směru scalable
	/// </summary>
	public class MDATileContainer: MDAContainer {
		public MDATileContainer()
			: base() {
			this._docking = MDADockingEnum.fill;
			this.Scalable = MDAScalableEnum.vertical;
		}

		/// <summary>
		/// přidá prvek do seznamu
		/// </summary>
		/// <param name="control">prvek na pridání</param>
		public override bool AddObject(IMDAObject mdaObject) {
			MDAControl control = mdaObject as MDAControl;
			if (control != null) {
				control.Parent = this;
				control.TopForm = this.TopForm;
				control.Docking = MDADockingEnum.fill;
				this._controls.Add(control);
				for (int i = 1; i < control.Repeat; i++) {
					this._controls.Add((MDAControl)control.Clone());
				}
				return true;
			}
			// nastaveni dalsich vlastnosti
			return base.AddObject(mdaObject);
		}

		public override bool SetProperty(string name, string value) {
			if (name == "align") {
				return base.SetProperty("scalable", value);
			}
			return base.SetProperty(name, value);
		}

		/// <summary>
		/// Každému prvku přiřadí jeho velikost
		/// </summary>
		/// <param name="spaceRectangle">volná plocha</param>
		/// <returns>volná plocha po odečtení obsazené</returns>
		public override Size MeasureContent(Rectangle spaceRectangle) {
			// zatím počítám, že Dlaždice mají nastavenou velikost, nebo vyplňují prostor
			if (_docking == MDADockingEnum.fill) {
				MDASize.Width = spaceRectangle.Width;
				MDASize.Height = spaceRectangle.Height;
			}

			if (_controls.Count == 0) {
				return new Size(MDASize.Width, MDASize.Height);
			}

			Size occupatedSize = new Size();
			SizeF elementSize = new SizeF();

			switch (this.Scalable) {
				case MDAScalableEnum.none:
				case MDAScalableEnum.both:
				case MDAScalableEnum.horizontal:
					elementSize.Width = MDASize.Width / (float)this._controls.Count;
					elementSize.Height = MDASize.Height;
					break;
				case MDAScalableEnum.vertical:
					elementSize.Width = MDASize.Width;
					elementSize.Height = MDASize.Height / (float)this._controls.Count;
					break;
			}

			// spočítá a vrátí velikost obsazený prostor
			float offset = 0.5f; // připočtena půlka pro zaokrouhlování (takhle se nemusí přičítat u každé operace)
			for (int i = 0; i < _controls.Count; i++) {
				MDAControl control = (MDAControl)_controls[i];
				if (control.Visible) {
					if (this.Scalable == MDAScalableEnum.vertical) {
						control.Measure(new Rectangle(MDAPosition.X, MDAPosition.Y + (int)offset, MDASize.Width, (int)(offset + elementSize.Height) - (int)offset));
						offset += elementSize.Height;
					} else {
						control.Measure(new Rectangle(MDAPosition.X + (int)offset, MDAPosition.Y, (int)(offset + elementSize.Width) - (int)offset, MDASize.Height));
						offset += elementSize.Width;
					}
					occupatedSize = control.AddOccupatedSize(occupatedSize);
				}
			}

			return occupatedSize;
		}
	}
}
